﻿
/**
* 命名空间: Game.TDBehaviorTree
*
* 功 能： 并行节点
*         遍历子节点，直到碰到失败返回失败
*         成功计数+1 直到所有成功 返回成功
*         运行中则返回Runnig继续执行，直到全部成功或者碰到失败
*         这里并行节点是等到全部完成但是完成的不会再次触发
* 类 名： NodeParallel
*
* Ver 变更日期 负责人 变更内容
* ───────────────────────────────────
* V0.01 2019/12/11 18:21:14  
*/




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Game.TDBehaviorTree
{
    [System.Serializable]
    /// <summary>
    /// 并行节点(组合节点)
    /// </summary>
    public class NodeParallel : NodeCombine
    {
      
        [NonSerialized]
        protected List<int> m_CompleteIndex = new List<int>();

        public NodeParallel() : base(NodeType.Parallel)
        {

        }

        public override NodeResultType Execute()
        {
          
            NodeResultType resultType = NodeResultType.Fail;
            for (int i = 0; i < m_childNodes.Count; i++)
            {
                if (m_CompleteIndex.Contains(i))
                {
                    continue;
                }
                else
                {
                    NodeBase _node = m_childNodes[i];
                    resultType = _node.Execute();
                    if (resultType == NodeResultType.Fail)
                        break;
                    if (resultType == NodeResultType.Success)
                    {
                        m_CompleteIndex.Add(i);
                        continue;
                    }
                    if (resultType == NodeResultType.Running)
                        continue;
                }
                
            }

            if (resultType != NodeResultType.Fail)
            {
                resultType = m_CompleteIndex.Count >= m_childNodes.Count ? NodeResultType.Success : NodeResultType.Running;
            }
            return resultType;

        }
    }
}
